package com.ruoyi.web.controller.tool.voiceCall.Listener;

import cn.hutool.extra.spring.SpringUtil;
import com.alicom.mns.tools.MessageListener;
import com.aliyun.mns.model.Message;
import com.detabes.apilog.utils.TraceIdUtil;
import com.google.gson.Gson;

import com.ruoyi.web.controller.tool.voiceCall.domain.VoiceReportCallbackDTO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;


/**
 * 回执消息队列监听器
 * 如有同一个消费队列被两个监听器监听，两个都可以收到消息，但不是同时收到。两边都返回false会重试，只要有一边返回true都会消费掉消息
 * https://help.aliyun.com/zh/vms/developer-reference/mns-message-queue-consumption-mode-1?spm=a2c4g.11186623.0.0.7fb67991s8tTU3
 */
@Slf4j
@Component
public class MyMessageListener implements MessageListener {
    private Gson gson=new Gson();

    @Override
    public boolean dealMessage(Message message) {
        TraceIdUtil.addTraceId(null);
        try{
            log.info("语音电话消息队列接受参数:" + message);
            //这里开始编写您的业务代码
            VoiceReportCallbackDTO dto = gson.fromJson(message.getMessageBodyAsString(), VoiceReportCallbackDTO.class);
            log.info("解析参数：{}",dto);

        }catch(com.google.gson.JsonSyntaxException e){
            log.error("语音电话消息队列参数JSON格式错误:"+message.getMessageBodyAsString(),e);
            //理论上不会出现格式错误的情况，所以遇见格式错误的消息，只能先delete,否则重新推送也会一直报错
            return true;
        }catch (Exception e) {
            log.error("语音电话消息队列处理异常",e);
            //您自己的代码部分导致的异常，应该return false,这样消息不会被delete掉，而会根据策略进行重推
            return false;
        }finally {
            TraceIdUtil.clearTraceId();
        }
        //消息处理成功，返回true, SDK将调用MNS的delete方法将消息从队列中删除掉
        return true;
    }
}
